package com.ktwlrj.core.constant;


import org.springframework.http.HttpStatus;

/**
 * 操作响应码枚举类
 * 对应restful返回标准httpStatus，默认为400请求错误
 *
 * @author Administrator
 */
public enum ResultCode implements IEnum {
    /**
     * 操作成功，httpStatus：200（请求成功）
     */
    SUCCESS(0, "操作成功", HttpStatus.OK.value()),

    /**
     * 服务器发生未知错误，httpStatus：500（服务器错误）
     */
    UNKNOWN_ERROR(5001, "服务器发生未知错误", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 全局程序异常错误，httpStatus：500（服务器错误）
     */
    EXECPTION_ERROR(5002, "全局程序异常错误", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 请求页面或接口不存在，httpStatus：503（Service Unavailable 服务不可用）
     */
    HTTP_404_ERROR(5004, "请求页面或接口不存在", HttpStatus.SERVICE_UNAVAILABLE.value()),

    // 数据输入相关
    /**
     * 输入内容错误
     */
    DATA_INPUT_ERROR(1001, "输入内容错误"),
    /**
     * 参数不允许为空
     */
    DATA_INPUT_EMPTY(1002, "参数不允许为空"),
    /**
     * 输入类型错误
     */
    DATA_INPUT_TYPE_ERROR(1003, "输入类型错误"),
    /**
     * 数据超过允许范围
     */
    DATA_INPUT_OVERRUN(1004, "数据超过允许范围"),
    /**
     * 数据已被禁用
     */
    DATA_DISABLE(1005, "数据已被禁用"),

    // 数据库相关，返回restful标准错误码均为服务器内部错误500
    /**
     * 数据库操作失败
     */
    DATABASE_BASE_ERROR(1020, "数据库操作失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据读取失败
     */
    DATABASE_SELECT_ERROR(1021, "数据读取失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据写入失败
     */
    DATABASE_INSER_ERROR(1022, "数据写入失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据更新失败
     */
    DATABASE_UPDATE_ERROR(1023, "数据更新失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据删除失败
     */
    DATABASE_REPEAT_ERROR(1024, "数据删除失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据库中查询无符合记录，httpStatus：404（请求内容不存在）
     */
    DATABASE_NODATA(1025, "数据库中查询无符合记录", HttpStatus.NOT_FOUND.value()),
    /**
     * 数据库关系失败
     */
    DATABASE_RELATION_ERROR(1026, "数据库关系失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 数据连接错误
     */
    DATABASE_CONN_ERROR(1027, "数据连接错误", HttpStatus.INTERNAL_SERVER_ERROR.value()),

    /**
     * 邮件发送失败
     */
    EMAIL_FAILURE_SEND(1028, "邮件发送失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),

    /**
     * 短信发送失败
     */
    SMS_FAILURE_SEND(1029, "短信发送失败", HttpStatus.INTERNAL_SERVER_ERROR.value()),

    // 验证相关
    /**
     * 存在外部关系
     */
    EXIST_OUT_RELATION(1030, "存在外部关系"),
    /**
     * 验证失败
     */
    VERIFICATION_FAILED(1031, "验证失败"),
    /**
     * 已存在数据
     */
    EXIST_REPEAT(1032, "已存在数据"),

    // 接口相关，调用接口失败均返回service unavailable
    /**
     * 接口暂未开放，无法访问，httpStatus：503（Service Unavailable 服务不可用）
     */
    INTERFACE_CLOSE(1040, "接口暂未开放，无法访问", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * 接口请求错误或失败，httpStatus：503（Service Unavailable 服务不可用）
     */
    INTERFACE_REQUEST_ERROR(1041, "接口请求错误或失败", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * 接口网关地址错误，httpStatus：502（网关错误）
     */
    INTERFACE_GATEWAY_ERROR(1042, "接口网关地址错误", HttpStatus.BAD_GATEWAY.value()),
    /**
     * 接口调用响应超时，httpStatus：503（Service Unavailable 服务不可用）
     */
    INTERFACE_TIMEOUT_ERROR(1043, "接口调用响应超时", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * 网络不可用，httpStatus：503（Service Unavailable 服务不可用）
     */
    INTERFACE_NETWORK_ERROR(1045, "网络不可用", HttpStatus.SERVICE_UNAVAILABLE.value()),

    // 接口签名相关
    /**
     * 该接口已被停用，httpStatus：503（Service Unavailable 服务不可用）
     */
    API_DISABLE(1060, "该接口已被停用", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * API接口调用失败，httpStatus：503（Service Unavailable 服务不可用）
     */
    API_ERROR(1061, "API接口调用失败", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * 缺少appId参数
     */
    API_APPKEY_MISS_ERROR(1062, "缺少appId参数"),
    /**
     * 缺少token参数，httpStatus：401（没有传token）
     */
    API_TOKEN_MISS_ERROR(1063, "缺少token参数", HttpStatus.UNAUTHORIZED.value()),
    /**
     * 缺少sign参数
     */
    API_SIGN_MISS_ERROR(1064, "缺少sign参数"),
    /**
     * 签名错误
     */
    API_SIGN_ERROR(1065, "签名错误"),
    /**
     * appid参数错误
     */
    API_APPKEY_ERROR(1066, "appid参数错误"),
    /**
     * token令牌参数无效
     */
    API_TOKEN_ERROR(1067, "token参数无效"),
    /**
     * code参数不存在
     */
    API_CODE_MISS_ERROR(1068, "code参数不存在"),
    /**
     * 接口属于待审核状态，无法使用，httpStatus：503（Service Unavailable 服务不可用）
     */
    API_PENDING(1069, "接口属于待审核状态，无法使用", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * 接口审核被拒，无法使用，httpStatus：503（Service Unavailable 服务不可用）
     */
    API_REJECTED(1070, "接口审核被拒，无法使用", HttpStatus.SERVICE_UNAVAILABLE.value()),
    /**
     * token令牌失效
     */
    API_TOKEN_TIMEOUT(1071, "token令牌失效"),
    /**
     * code有效期超时
     */
    API_CODE_TIMEOUT(1072, "code有效期超时"),
    /**
     * code参数错误
     */
    API_CODE_ERROR(1073, "code参数错误"),
    /**
     * 参数错误
     */
    API_PARAM_ERROR(1074, "参数错误"),

    // 脚本引擎相关
    /**
     * 脚本执行异常，httpStatus：500（服务器错误）
     */
    SCRIPT_EVAL_ERROR(1090, "脚本执行异常", HttpStatus.INTERNAL_SERVER_ERROR.value()),

    // 文件相关
    /**
     * 文件大小超出服务器限制，httpStatus：413（请求体过大）
     */
    FILE_MAXSIZE_ERROR(1501, "文件大小超出服务器限制", HttpStatus.PAYLOAD_TOO_LARGE.value()),
    /**
     * 无效的文件格式
     */
    FILE_FORMAT_ERROR(1502, "无效的文件格式"),
    /**
     * 文件保存出错，httpStatus：500（服务器错误）
     */
    FILE_SAVE_ERROR(1502, "文件保存出错", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 文件上传出错，httpStatus：500（服务器错误）
     */
    FILE_TRANSFER_ERROR(1502, "文件上传出错", HttpStatus.INTERNAL_SERVER_ERROR.value()),
    /**
     * 文件上传参数错误
     */
    UPLOAD_PARAM_ERROR(1502, "文件上传参数错误"),
    // 权限相关
    /**
     * 没有权限，httpStatus：403（禁止访问）
     */
    AUTH_ACCESS_DENIED(4001, "没有权限", HttpStatus.FORBIDDEN.value()),
    /**
     * 用户名或密码错误
     */
    AUTH_ACCOUNT_ERROR(4002, "用户名或密码错误"),
    /**
     * 用户未登录，httpStatus：403（禁止访问）
     */
    AUTH_NO_LOGIN(4003, "用户未登录", HttpStatus.FORBIDDEN.value()),
    /**
     * 登录超时，httpStatus：403（禁止访问）
     */
    AUTH_SESSION_TIMEOUT(4004, "登录超时", HttpStatus.FORBIDDEN.value()),
    /**
     * 账号已锁定，httpStatus：403（禁止访问）
     */
    AUTH_ACCOUNT_LOCKED(4005, "账号已锁定", HttpStatus.FORBIDDEN.value()),
    /**
     * 密码强度不符合要求
     */
    AUTH_PASSWORD_STRENGTH(4006, "密码强度不符合要求"),
    /**
     * 重试次数已达上限
     */
    AUTH_RETRY_EXTRA(4007, "重试次数已达上限"),
    /**
     * 该账号未激活，请稍后再试，httpStatus：403（禁止访问）
     */
    AUTH_ACCOUNT_UNACTIVATED(4008, "该账号未激活，请稍后再试", HttpStatus.FORBIDDEN.value()),
    /**
     * 该账号未激活，请稍后再试，请稍后再试，httpStatus：403（禁止访问）
     */
    AUTH_ACCOUNT_DISABLED(4008, "该账号已停用，请与管理员联系", HttpStatus.FORBIDDEN.value()),

    /**
     * 该账号未激活，请稍后再试，请稍后再试，httpStatus：401（禁止访问）
     */
    AUTH_FAIL(4008, "授权失败", HttpStatus.FORBIDDEN.value()),

    /**
     * 用户名或密码错误
     */
    AUTH_MUST_USBKEY(4101, "必须使用U盾登录"),
    /**
     * U盾签名校验失败
     */
    AUTH_USBKEY_SIGN_ERROE(4102, "U盾签名校验失败"),
    /**
     * U盾序列号不匹配
     */
    AUTH_USBKEY_SN_MISMATCH(4103, "U盾序列号不匹配"),
    /**
     * U盾时间戳校验失败
     */
    AUTH_USBKEY_TIME_OUT(4104, "U盾时间戳校验失败"),
    /**
     * 图形验证码超时
     */
    LOGIN_VERIFY_TIME_OUT(4105, "图形验证码超时"),
    /**
     * 图形验证码不正确
     */
    LOGIN_VERIFY_ERROR(4106, "图形验证码不正确"),
    /**
     * 请输入图形验证码
     */
    LOGIN_VERIFY_MISS(4107, "请输入图形验证码");
    private int value;
    private String description;
    private int httpStatus;

    /**
     * httpStatus不传默认为请求错误
     *
     * @param value
     * @param description
     */
    private ResultCode(int value, String description) {
        this.value = value;
        this.description = description;
        this.httpStatus = HttpStatus.BAD_REQUEST.value();
    }

    private ResultCode(int value, String description, int httpStatus) {
        this.value = value;
        this.description = description;
        this.httpStatus = httpStatus;
    }

    /**
     * 获取枚举值
     *
     * @return
     */
    @Override
    public int getValue() {
        return value;
    }

    /**
     * 获取枚举值对应的描述信息
     *
     * @return
     */
    @Override
    public String getDescription() {
        return description;
    }

    public int getHttpStatus() {
        return httpStatus;
    }

    /**
     * 通过value获取httpStatus
     *
     * @param value
     * @return
     */
    public static int getHttpStatus(int value) {
        ResultCode[] var1 = values();
        for (ResultCode c : var1) {
            if (c.getValue() == value) {
                return c.httpStatus;
            }
        }
        //默认返回200
        return HttpStatus.OK.value();
    }
}
